<?php


namespace app\utils;


use Exception;
use Firebase\JWT\JWT;
use Firebase\JWT\Key;

class JWTUtil
{
    private $key ;

    function __construct(){
        $this->key = env('app.name');
    }

    /**
     * 生成验签
     * @param int $user_id 用户id
     * @return mixed
     */
    function signToken(int $user_id)
    {
        $token = array(
            "iss" => $this->key,        //签发者 可以为空
            "aud" => '',          //面象的用户，可以为空
            "iat" => time(),      //签发时间
            "nbf" => time(),       //在什么时候jwt开始生效
            "exp"=>'',
            "data" => [           //记录的uid的信息
                'user_id' => $user_id,
            ]
        );
        $jwt = JWT::encode($token, $this->key, "HS256");  //生成了 token
        return $jwt;
    }

    /**
     * 验证token
     * @param $token
     * @return array|int[]
     */
    function checkToken($token)
    {
        $res['status'] = false;
        try {
            JWT::$leeway = 60;//当前时间减去60，把时间留点余地
            $decoded = JWT::decode($token, new Key($this->key, 'HS256')); //HS256方式，这里要和签发的时候对应
            $arr = (array)$decoded;
            $res['status'] = 200;
            $res['data'] = (array)$arr['data'];
            return $res;

        } catch (\Firebase\JWT\SignatureInvalidException $e) { //签名不正确
            $res['info'] = "签名不正确";
            return $res;
        } catch (\Firebase\JWT\BeforeValidException $e) { // 签名在某个时间点之后才能用
            $res['info'] = "token失效";
            return $res;
        } catch (\Firebase\JWT\ExpiredException $e) { // token过期
            $res['info'] = "token过期";
            return $res;
        } catch (Exception $e) { //其他错误
            $res['info'] = "未知错误";
            return $res;
        }
    }

}